///////////////////////////////////////////////////////////////
/// $Id: operate_unit_test.cc 35 2009-10-12 10:04:29Z tonyjobmails $
/// $Date: 2009-10-12 10:04:29 +0000 (Mon, 12 Oct 2009) $
/// $Author: tonyjobmails $
/// $Revision: 35 $
/// E-mail: tonyjobmails@gmail.com
/// filename: operate_unit_test.cc
/// function: 操作机制的运用示例与单元测试
///////////////////////////////////////////////////////////////
#include "operate.h"

///////////////////////////////////////////////////////////////
/// @brief 测试使用的公共接口
template<typename _T1, typename _T2>
void func_1(_T1 data[], int num, op::check_codition<_T1, _T2> *cond, op::action<_T1, _T2> *op)
{
	while(--num >= 0)
	{
		if(cond && (*cond)(data[num]))
		{
			if(op)
				(*op)(data[num]);
		}
	}
}
///////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////
/// @brief 测试使用公共接口
template<typename _T1, typename _T2>
void func_2(_T1 data[], int num, op::action<_T1, _T2> *op)
{
	while(--num >= 0)
	{
		if(op)
			(*op)(data[num]);
	}
}
///////////////////////////////////////////////////////////////

namespace op
{
	///////////////////////////////////////////////////////////////
	/// 闰年判断
	class leap_year_condition : public op_base<int, int>
	{
		public:
			leap_year_condition() {};
			~leap_year_condition() {};

			bool operator()(const int &data)
			{
				if((data % 4 == 0 && data % 100 != 0) || data % 400 == 0)
					return true;
				return false;
			}
	};
	///////////////////////////////////////////////////////////////
}

int main()
{
	///////////////////////////////////////////////////////////////
	/// leap year etc.
	int year[5] = {1985, 1994, 2000, 2004, 2008};

	op::leap_year_condition condition;		/// 条件
	op::check_codition<int, int> check;	/// 检查操作
	check.set_logic(op::_LOGIC_OR);		/// 设置成逻辑与
	check.add_condition(&condition);		/// 把条件加入

	op::action_print<int> print;					/// 执行接口

	func_1<int, int>(year, 5, &check, &print);			/// 执行
	///////////////////////////////////////////////////////////////

	std::cout << std::endl << "///////////////////////Bonzer Splitted Line///////////////////////" << std::endl;

	///////////////////////////////////////////////////////////////
	/// 筛选集合元素(打印set集合中不属于cond_1与cond_2的元素)
	int cond_1[5] = {1, 3, 8, 9, 10};
	int cond_2[5] = {2, 5, 9, 13, 16};
	int set[8] = {1, 2, 4, 7, 9, 11, 13, 16};

	/// 条件结构
	op::_condition<int> cond_tmp;
	cond_tmp.equal = false;

	/// 定义两组条件
	op::condition<int> condition_1;
	op::condition<int> condition_2;

	/// 设置组内条件的逻辑关系为逻辑与
	condition_1.set_logic(op::_LOGIC_AND);
	condition_2.set_logic(op::_LOGIC_AND);

	/// 定义打印对象
	op::action_print<int> act_print;

	/// 分别构成两组条件
	int pos = 0;
	for(; pos < 5; ++pos)
	{
		cond_tmp.cond_data = cond_1[pos];
		condition_1.add_condition(cond_tmp);
	}
	pos = 0;
	for(; pos < 5; ++pos)
	{
		cond_tmp.cond_data = cond_2[pos];
		condition_2.add_condition(cond_tmp);
	}
	/// 把两组条件加入
	act_print.add_condition(&condition_1);
	act_print.add_condition(&condition_2);

	/// 把两组条件的逻辑关系设置为逻辑与
	act_print.set_logic(op::_LOGIC_AND);

	func_2(set, 8, &act_print);

	std::cout << std::endl;
	///////////////////////////////////////////////////////////////
	return 0;
}
